package br.com.datasun.biblioteca.ui;

import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import java.awt.Font;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import javax.swing.JTextField;
import javax.swing.JButton;

import images.ImageLoader;
import javax.swing.JFormattedTextField;
import javax.swing.text.MaskFormatter;
import java.awt.FlowLayout;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import br.com.datasun.biblioteca.entities.EstadoConservacao;
import br.com.datasun.biblioteca.entities.Livro;
import br.com.datasun.biblioteca.entities.Exemplar;
import br.com.datasun.biblioteca.entities.Emprestimo;
import br.com.datasun.biblioteca.entities.PessoaFisica;
import br.com.datasun.biblioteca.ui.components.EmprestimoTableModel;
import br.com.datasun.biblioteca.ui.controller.EmprestimoExemplarController;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;


public class EmprestimoExemplarUI extends JPanel {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JLabel jlTitulo = new JLabel("Empr\u00E9stimo de Livro");
	private JPanel jpCabecalhoEmprestimo = new JPanel();
	private JPanel jpDetalhesEmprestimo = new JPanel();
	private JPanel jpCabecallhoEmprestimoBotoes = new JPanel();
	private JPanel jpCabecalhoEmprestimoDados = new JPanel();
	private JPanel jpDetalhesEmprestimoBotoes = new JPanel();
	private JPanel jpDetalhesEmprestimoTabela = new JPanel();
	private JLabel jlOperador = new JLabel("");
	private JLabel jlOperadorDescricao = new JLabel("");
	private JLabel jlCliente = new JLabel("Cliente");
	private JTextField jtCliente = new JTextField();
	private JButton jbPesquisarCliente = new JButton("");
	private JLabel jlExemplar = new JLabel("Cod. Exemplar");
	private JTextField jtCodExemplar = new JTextField();
	private JLabel jlDataDevolucao = new JLabel("Data Prev. Devolu\u00E7\u00E3o");
	private final JFormattedTextField jftDataPrevDevolucao = new JFormattedTextField();
	private MaskFormatter dateMaskFormater;
	private final JLabel jlTituloLivro = new JLabel("T\u00EDtulo Livro");
	private final JLabel jlTituloLivroDescricao = new JLabel("");
	private final JLabel jlEstadoConservacao = new JLabel("Estado Conserva\u00E7\u00E3o");
	private final JLabel jlEstadoConservacaoDescricao = new JLabel("");
	private final JLabel jlNomeCliente = new JLabel("Nome Cliente");
	private final JLabel jlNomeClienteDescricao = new JLabel("");
	private final JLabel jlCPF = new JLabel("CPF");
	private final JLabel jlCPFDescricao = new JLabel("");
	private final JButton jbAdicionar = new JButton("");
	private final JButton jbNovo = new JButton("");
	private final JButton jbLimpar = new JButton("");
	private final JPanel jpItensEmprestimo = new JPanel();
	private final JPanel jpItensEmprestimoBotoes = new JPanel();
	private final JButton jbConfirmar = new JButton("");
	private final JButton jbFechar = new JButton("");
	private final JPanel jpItensEmprestimoTabela = new JPanel();
	
	private JScrollPane jscrollPane = new JScrollPane();
	private JTable tabelaEmprestimo = new JTable();
	private EmprestimoTableModel model = new EmprestimoTableModel();
	
	private PessoaFisica clienteSelecionado = new PessoaFisica();
	
	private EmprestimoExemplarController controller;

	/**
	 * Create the panel.
	 */
	public EmprestimoExemplarUI() {
		try{
			inicializar();
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	private void inicializar()throws Exception{		
			jtCliente.setEditable(false);
			jtCliente.setPreferredSize(new Dimension(200,20));
			setLayout(new BorderLayout(0, 0));
			
			jlTitulo.setPreferredSize(new Dimension(40,40));
			jlTitulo.setFont(new Font("Tahoma", Font.BOLD, 11));
			jlTitulo.setHorizontalAlignment(SwingConstants.CENTER);
			add(jlTitulo, BorderLayout.NORTH);
			
			JPanel jpBase = new JPanel();
			add(jpBase, BorderLayout.CENTER);
			GridBagLayout gbl_jpBase = new GridBagLayout();
			gbl_jpBase.columnWidths = new int[]{0, 700, 0, 0};
			gbl_jpBase.rowHeights = new int[]{0, 600, 0, 0};
			gbl_jpBase.columnWeights = new double[]{1.0, 0.0, 1.0, Double.MIN_VALUE};
			gbl_jpBase.rowWeights = new double[]{1.0, 0.0, 1.0, Double.MIN_VALUE};
			jpBase.setLayout(gbl_jpBase);
			
			JPanel panel = new JPanel();
			GridBagConstraints gbc_panel = new GridBagConstraints();
			gbc_panel.insets = new Insets(0, 0, 5, 5);
			gbc_panel.fill = GridBagConstraints.BOTH;
			gbc_panel.gridx = 1;
			gbc_panel.gridy = 1;
			jpBase.add(panel, gbc_panel);
			panel.setLayout(new BorderLayout(0, 0));
			
			jpCabecalhoEmprestimo.setPreferredSize(new Dimension(40, 300));
			panel.add(jpCabecalhoEmprestimo, BorderLayout.NORTH);
			jpCabecalhoEmprestimo.setLayout(new BorderLayout(0, 0));
			FlowLayout flowLayout = (FlowLayout) jpCabecallhoEmprestimoBotoes.getLayout();
			flowLayout.setHgap(10);
			flowLayout.setAlignment(FlowLayout.RIGHT);
			
			jpCabecallhoEmprestimoBotoes.setPreferredSize(new Dimension(50,50));
			jpCabecalhoEmprestimo.add(jpCabecallhoEmprestimoBotoes, BorderLayout.SOUTH);
			
			Dimension tamanhoBotoes = new Dimension(115,25);
			jbLimpar.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					controller.btnLimparEventHandler();
				}
			});
			jbLimpar.setPreferredSize(tamanhoBotoes);
			jbNovo.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					controller.btnNovoEventHandler();
				}
			});
			jbNovo.setPreferredSize(tamanhoBotoes);
			jbAdicionar.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					controller.btnAdicionarEventHandler();
				}
			});
			
			
			jbAdicionar.setPreferredSize(tamanhoBotoes);
			
			jbLimpar.setIcon(ImageLoader.createImageIcon("btnLimpar115x25.png"));
			jbNovo.setIcon(ImageLoader.createImageIcon("btnNovo115x25.png"));
			jbAdicionar.setIcon(ImageLoader.createImageIcon("btnAdicionar115x25.png"));
			
			jpCabecallhoEmprestimoBotoes.add(jbLimpar);
			
			jpCabecallhoEmprestimoBotoes.add(jbNovo);
			
			jpCabecallhoEmprestimoBotoes.add(jbAdicionar);
			
			jpCabecalhoEmprestimo.add(jpCabecalhoEmprestimoDados, BorderLayout.WEST);
			GridBagLayout gbl_jpCabecalhoEmprestimoDados = new GridBagLayout();
			gbl_jpCabecalhoEmprestimoDados.columnWidths = new int[]{150, 192, 0, 0};
			gbl_jpCabecalhoEmprestimoDados.rowHeights = new int[]{30, 30, 30, 0, 30, 30, 30, 30, 0};
			gbl_jpCabecalhoEmprestimoDados.columnWeights = new double[]{0.0, 0.0, 0.0, Double.MIN_VALUE};
			gbl_jpCabecalhoEmprestimoDados.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
			jpCabecalhoEmprestimoDados.setLayout(gbl_jpCabecalhoEmprestimoDados);
			
			GridBagConstraints gbc_jlOperador = new GridBagConstraints();
			gbc_jlOperador.insets = new Insets(0, 0, 5, 5);
			gbc_jlOperador.anchor = GridBagConstraints.EAST;
			gbc_jlOperador.gridx = 0;
			gbc_jlOperador.gridy = 0;
			jlOperador.setFont(new Font("Tahoma", Font.BOLD, 11));
			jpCabecalhoEmprestimoDados.add(jlOperador, gbc_jlOperador);
			
			GridBagConstraints gbc_jlOperadorDescricao = new GridBagConstraints();
			gbc_jlOperadorDescricao.insets = new Insets(0, 0, 5, 5);
			gbc_jlOperadorDescricao.anchor = GridBagConstraints.WEST;
			gbc_jlOperadorDescricao.gridx = 1;
			gbc_jlOperadorDescricao.gridy = 0;
			jpCabecalhoEmprestimoDados.add(jlOperadorDescricao, gbc_jlOperadorDescricao);
			
			GridBagConstraints gbc_jlCliente = new GridBagConstraints();
			gbc_jlCliente.anchor = GridBagConstraints.EAST;
			gbc_jlCliente.insets = new Insets(0, 0, 5, 5);
			gbc_jlCliente.gridx = 0;
			gbc_jlCliente.gridy = 1;
			jlCliente.setFont(new Font("Tahoma", Font.BOLD, 11));
			jpCabecalhoEmprestimoDados.add(jlCliente, gbc_jlCliente);
			
			GridBagConstraints gbc_jtCliente = new GridBagConstraints();
			gbc_jtCliente.fill = GridBagConstraints.HORIZONTAL;
			gbc_jtCliente.insets = new Insets(0, 0, 5, 5);
			gbc_jtCliente.gridx = 1;
			gbc_jtCliente.gridy = 1;
			jpCabecalhoEmprestimoDados.add(jtCliente, gbc_jtCliente);
			
			GridBagConstraints gbc_jbPesquisarCliente = new GridBagConstraints();
			gbc_jbPesquisarCliente.anchor = GridBagConstraints.WEST;
			gbc_jbPesquisarCliente.insets = new Insets(0, 0, 5, 0);
			gbc_jbPesquisarCliente.gridx = 2;
			gbc_jbPesquisarCliente.gridy = 1;
			jbPesquisarCliente.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					controller.btnPesquisarClienteEventHandler();
				}
			});
			jbPesquisarCliente.setPreferredSize(new Dimension(33,25));
			jbPesquisarCliente.setIcon(ImageLoader.createImageIcon("btnPesquisar33x25.png"));
			jpCabecalhoEmprestimoDados.add(jbPesquisarCliente, gbc_jbPesquisarCliente);
			
			GridBagConstraints gbc_jlExemplar = new GridBagConstraints();
			gbc_jlExemplar.anchor = GridBagConstraints.EAST;
			gbc_jlExemplar.insets = new Insets(0, 0, 5, 5);
			gbc_jlExemplar.gridx = 0;
			gbc_jlExemplar.gridy = 2;
			jlExemplar.setFont(new Font("Tahoma", Font.BOLD, 11));
			jpCabecalhoEmprestimoDados.add(jlExemplar, gbc_jlExemplar);
			
			GridBagConstraints gbc_jtCodExemplar = new GridBagConstraints();
			gbc_jtCodExemplar.anchor = GridBagConstraints.WEST;
			gbc_jtCodExemplar.insets = new Insets(0, 0, 5, 5);
			gbc_jtCodExemplar.gridx = 1;
			gbc_jtCodExemplar.gridy = 2;
			jtCodExemplar.setPreferredSize(new Dimension(100, 20));
			jpCabecalhoEmprestimoDados.add(jtCodExemplar, gbc_jtCodExemplar);
			
			GridBagConstraints gbc_jlDataDevolucao = new GridBagConstraints();
			gbc_jlDataDevolucao.anchor = GridBagConstraints.EAST;
			gbc_jlDataDevolucao.insets = new Insets(0, 0, 5, 5);
			gbc_jlDataDevolucao.gridx = 0;
			gbc_jlDataDevolucao.gridy = 3;
			jlDataDevolucao.setFont(new Font("Tahoma", Font.BOLD, 11));
			jpCabecalhoEmprestimoDados.add(jlDataDevolucao, gbc_jlDataDevolucao);
			
			GridBagConstraints gbc_jftDataPrevDevolucao = new GridBagConstraints();
			gbc_jftDataPrevDevolucao.anchor = GridBagConstraints.WEST;
			gbc_jftDataPrevDevolucao.insets = new Insets(0, 0, 5, 5);
			gbc_jftDataPrevDevolucao.gridx = 1;
			gbc_jftDataPrevDevolucao.gridy = 3;
			
			dateMaskFormater = new MaskFormatter("##/##/####");
			dateMaskFormater.setPlaceholderCharacter('_');
			jftDataPrevDevolucao.setEnabled(false);
			jftDataPrevDevolucao.setEditable(false);
			jftDataPrevDevolucao.setPreferredSize(new Dimension(100, 20));
			dateMaskFormater.install(jftDataPrevDevolucao);
			
			jpCabecalhoEmprestimoDados.add(jftDataPrevDevolucao, gbc_jftDataPrevDevolucao);
			
			GridBagConstraints gbc_jlTituloLivro = new GridBagConstraints();
			gbc_jlTituloLivro.anchor = GridBagConstraints.EAST;
			gbc_jlTituloLivro.insets = new Insets(0, 0, 5, 5);
			gbc_jlTituloLivro.gridx = 0;
			gbc_jlTituloLivro.gridy = 4;
			jlTituloLivro.setFont(new Font("Tahoma", Font.BOLD, 11));
			jpCabecalhoEmprestimoDados.add(jlTituloLivro, gbc_jlTituloLivro);
			
			GridBagConstraints gbc_jlTituloLivroDescricao = new GridBagConstraints();
			gbc_jlTituloLivroDescricao.anchor = GridBagConstraints.WEST;
			gbc_jlTituloLivroDescricao.insets = new Insets(0, 0, 5, 5);
			gbc_jlTituloLivroDescricao.gridx = 1;
			gbc_jlTituloLivroDescricao.gridy = 4;
			jpCabecalhoEmprestimoDados.add(jlTituloLivroDescricao, gbc_jlTituloLivroDescricao);
			
			GridBagConstraints gbc_jlEstadoConservacao = new GridBagConstraints();
			gbc_jlEstadoConservacao.fill = GridBagConstraints.HORIZONTAL;
			gbc_jlEstadoConservacao.insets = new Insets(0, 0, 5, 5);
			gbc_jlEstadoConservacao.gridx = 0;
			gbc_jlEstadoConservacao.gridy = 5;
			jlEstadoConservacao.setHorizontalAlignment(SwingConstants.RIGHT);
			jlEstadoConservacao.setFont(new Font("Tahoma", Font.BOLD, 11));
			jpCabecalhoEmprestimoDados.add(jlEstadoConservacao, gbc_jlEstadoConservacao);
			
			GridBagConstraints gbc_jlEstadoConservacaoDescricao = new GridBagConstraints();
			gbc_jlEstadoConservacaoDescricao.anchor = GridBagConstraints.WEST;
			gbc_jlEstadoConservacaoDescricao.insets = new Insets(0, 0, 5, 5);
			gbc_jlEstadoConservacaoDescricao.gridx = 1;
			gbc_jlEstadoConservacaoDescricao.gridy = 5;
			jpCabecalhoEmprestimoDados.add(jlEstadoConservacaoDescricao, gbc_jlEstadoConservacaoDescricao);
			
			GridBagConstraints gbc_jlNomeCliente = new GridBagConstraints();
			gbc_jlNomeCliente.fill = GridBagConstraints.HORIZONTAL;
			gbc_jlNomeCliente.insets = new Insets(0, 0, 5, 5);
			gbc_jlNomeCliente.gridx = 0;
			gbc_jlNomeCliente.gridy = 6;
			jlNomeCliente.setHorizontalAlignment(SwingConstants.RIGHT);
			jlNomeCliente.setFont(new Font("Tahoma", Font.BOLD, 11));
			jpCabecalhoEmprestimoDados.add(jlNomeCliente, gbc_jlNomeCliente);
			
			GridBagConstraints gbc_jlNomeClienteDescricao = new GridBagConstraints();
			gbc_jlNomeClienteDescricao.anchor = GridBagConstraints.WEST;
			gbc_jlNomeClienteDescricao.insets = new Insets(0, 0, 5, 5);
			gbc_jlNomeClienteDescricao.gridx = 1;
			gbc_jlNomeClienteDescricao.gridy = 6;
			jpCabecalhoEmprestimoDados.add(jlNomeClienteDescricao, gbc_jlNomeClienteDescricao);
			
			GridBagConstraints gbc_jlCPF = new GridBagConstraints();
			gbc_jlCPF.fill = GridBagConstraints.HORIZONTAL;
			gbc_jlCPF.insets = new Insets(0, 0, 0, 5);
			gbc_jlCPF.gridx = 0;
			gbc_jlCPF.gridy = 7;
			jlCPF.setHorizontalAlignment(SwingConstants.RIGHT);
			jlCPF.setFont(new Font("Tahoma", Font.BOLD, 11));
			jpCabecalhoEmprestimoDados.add(jlCPF, gbc_jlCPF);
			
			GridBagConstraints gbc_jlCPFDescricao = new GridBagConstraints();
			gbc_jlCPFDescricao.anchor = GridBagConstraints.WEST;
			gbc_jlCPFDescricao.insets = new Insets(0, 0, 0, 5);
			gbc_jlCPFDescricao.gridx = 1;
			gbc_jlCPFDescricao.gridy = 7;
			jpCabecalhoEmprestimoDados.add(jlCPFDescricao, gbc_jlCPFDescricao);
			
			panel.add(jpItensEmprestimo, BorderLayout.CENTER);
			jpItensEmprestimo.setLayout(new BorderLayout(0, 0));
			FlowLayout flowLayout_1 = (FlowLayout) jpItensEmprestimoBotoes.getLayout();
			flowLayout_1.setAlignment(FlowLayout.RIGHT);
			
			jpItensEmprestimoBotoes.setPreferredSize(new Dimension(40,40));
			
			jpItensEmprestimo.add(jpItensEmprestimoBotoes, BorderLayout.SOUTH);
			jbFechar.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					controller.btnFecharEventHandler();
				}
			});
			
			jbFechar.setPreferredSize(tamanhoBotoes);
			jbConfirmar.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					controller.btnConfirmarEventHandler();
				}
			});
			jbConfirmar.setPreferredSize(tamanhoBotoes);
			jbFechar.setIcon(ImageLoader.createImageIcon("btnFechar115x25.png"));
			jbConfirmar.setIcon(ImageLoader.createImageIcon("btnConfirmar115x25.png"));
			
			jpItensEmprestimoBotoes.add(jbFechar);
			
			jpItensEmprestimoBotoes.add(jbConfirmar);
			
			jpItensEmprestimo.add(jpItensEmprestimoTabela, BorderLayout.CENTER);
			jpItensEmprestimoTabela.setLayout(new BorderLayout(20, 20));
			
			
			
			jscrollPane.setViewportView(tabelaEmprestimo);
			jpItensEmprestimoTabela.add(jscrollPane);
			jpDetalhesEmprestimo.add(jpDetalhesEmprestimoTabela, BorderLayout.CENTER);
			
			tabelaEmprestimo.setModel(model);
						
			jpDetalhesEmprestimo.setLayout(new BorderLayout(0, 0));
			
			jpDetalhesEmprestimoBotoes.setPreferredSize(new Dimension(50,50));
			jpDetalhesEmprestimo.add(jpDetalhesEmprestimoBotoes, BorderLayout.SOUTH);
			
			controller = new EmprestimoExemplarController(this);
			
			editarCampos(false);
			
			

		}
	
	public void limparFormulario(){		
		jtCodExemplar.setText("");
		jftDataPrevDevolucao.setText("");
		jlTituloLivroDescricao.setText("");
		jlEstadoConservacaoDescricao.setText("");
		jtCliente.setText("");
		jlNomeClienteDescricao.setText("");
		jlCPFDescricao.setText("");
				
	}
	
	public void editarCampos(boolean editar){
		editarCliente(editar);
		jtCodExemplar.setEditable(editar);
		jftDataPrevDevolucao.setEditable(editar);
		jbLimpar.setEnabled(editar);
		jbNovo.setEnabled(!editar);
		jbAdicionar.setEnabled(editar);
		jbConfirmar.setEnabled(editar);
		
	}
	
	public void editarCliente(boolean editar){
		jbPesquisarCliente.setEnabled(editar);
	}
	
	public void exibirDadosCliente(){
		if (clienteSelecionado != null){
		   jtCliente.setText(clienteSelecionado.getNome());
		   jlCPFDescricao.setText(clienteSelecionado.getCPF().getNumero());
		   jlNomeClienteDescricao.setText(clienteSelecionado.getNome());
		}
	}
	
	public void exibirDadosExemplar(Exemplar exemplar){
		if (exemplar != null){
			Livro livro;
			livro = exemplar.getLivro();
			EstadoConservacao estadoConservacao= exemplar.getEstadoConservacao();
			
			jlTituloLivroDescricao.setText(livro.getTitulo());
			jlEstadoConservacaoDescricao.setText(EstadoConservacao.getValueOf(estadoConservacao.getId()).toString());
		}
	}
	
	public void requestFocusjtCodExemplar(){
		jtCodExemplar.requestFocus();		
	}
	
	public void limparCodExemplar(){
		jtCodExemplar.setText("");
	}

	public void setClienteSelecionado(PessoaFisica clienteSelecionado) {
		this.clienteSelecionado = clienteSelecionado;
	}

	public PessoaFisica getClienteSelecionado() {
		return clienteSelecionado;
	}
	
	public void limparClienteSelecionado(){
		clienteSelecionado = null;
		jtCliente.setText("");
		jlNomeClienteDescricao.setText("");
		jlCPFDescricao.setText("");
	}
	
	public List<Emprestimo> getEmprestimos(){
		return model.getEmprestimos();
	}
	
	public void atualizarGrid(){
		model.AtualizarGrid();
	}
	
	public String getCodExemplarInformado(){
		return jtCodExemplar.getText();
	}
	
	public void exibirDadosEmprestimo(Emprestimo emprestimo){
		Date dataPrevistaDevolucao;
		dataPrevistaDevolucao = emprestimo.getDtPrevistaDevolucao();
		
		SimpleDateFormat sdf = new SimpleDateFormat ("dd/MM/yyyy");  
        jftDataPrevDevolucao.setText(sdf.format(dataPrevistaDevolucao).toString());
	}
	
	public void limparEmprestimos(){
		model.limparEmprestimos();
		model.AtualizarGrid();
	}
	
	

}
